﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using Sio.Mdm.Entities;
using Sio.Mdm.BF.Ldap;
using Sio.Mdm.BF.Administracija;
using Sio.Mdm.Types.Database;
using Sio.Mdm.Web.Controls;

namespace Sio.Mdm.Web.Instalacija
{
    public partial class LdapPravilaPodrobno : Controls.Page
    {
        #region Properties
        int PraviloID
        {
            get
            {
                return Request.GetValue<int>("PraviloID");
            }
        }

        //int OrgarnizacijaID
        //{
        //    get
        //    {
        //        return Request.GetValue<int>("OrgarnizacijaID");
        //    }
        //}
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {            
            if (!IsPostBack && !X.IsAjaxRequest)
            {                                
                if (PraviloID > 0)
                {
                    LoadPravilo(PraviloID);
                }
                LoadOrgarnizacije();
                LoadTipiEntitet();
                LoadStreznikiPredloge();
            }
            
            //cmbStreznik.SetValue(101);
        }

        private void LoadPravilo(int PraviloID)
        {
            LdapPravilo pravilo = EntityFactory.LoadEntity<LdapPravilo>(
            new Filter<LdapPravilo>().Where(r => r.LdapPraviloID == PraviloID));

            txtIme.Text = pravilo.Ime;
            txtOpis.Text = pravilo.Opis;
            txtBaseDN.Text = pravilo.BaseDN;            
            cmbStreznik.SelectedItem.Value = pravilo.LdapStreznikID.ToString();
            cmbPredloga.SelectedItem.Value = pravilo.LdapPredlogaID.ToString();
            cmbOrgarnizacije.SelectedItem.Value = pravilo.OrgarnizacijaID.ToString();
            chkAktivno.Checked = pravilo.Aktivno;

            cmbOrgarnizacije.Disabled = true;

            LdapSinObjekt sinObjekt = EntityFactory.LoadEntity<LdapSinObjekt>(
                new Filter<LdapSinObjekt>().Where(r => r.LdapPraviloID == PraviloID));

            cmbTipEntitete.SelectedItem.Value = sinObjekt.ObjektTipID.ToString();
            
        }

        private void LoadOrgarnizacije()
        {
            EntityCollection<Sio.Mdm.Types.Database.Organizacija> orgarnizacije = new EntityCollection<Sio.Mdm.Types.Database.Organizacija>(
                  new Filter<Sio.Mdm.Types.Database.Organizacija>().Where(o => o.OrganizacijaId != null).OrderBy(o => o.Naziv));
            StoreOrgarnizacije.DataSource = orgarnizacije;
            StoreOrgarnizacije.DataBind();            
        }

        private void LoadTipiEntitet()
        {
            Dictionary<int, string> listTip = new Dictionary<int, string>();
            listTip.Add(2, "Učeči");
            listTip.Add(3, "Osebje");
            listTip.Add(4, "Starši");
            var tmpArray = (from p in listTip select new Object[2] { p.Key, p.Value }).ToArray();

            StoreTipiEntitete.DataSource = tmpArray;
            StoreTipiEntitete.DataBind();
        }

        private void LoadStreznikiPredloge()
        {
            string warning="";

            if (String.IsNullOrEmpty(cmbOrgarnizacije.SelectedItem.Value))
            {
                return;
            }
            
            int OrgID = Convert.ToInt32(cmbOrgarnizacije.SelectedItem.Value);

            EntityCollection<LdapStreznik> strezniki = new EntityCollection<LdapStreznik>(
                  new Filter<LdapStreznik>().Where(o => o.OrgarnizacijaID == OrgID).OrderBy(o => o.Ime));
            StoreStrezniki.DataSource = strezniki;
            StoreStrezniki.DataBind();
            
            EntityCollection<LdapPredloga> predloge = new EntityCollection<LdapPredloga>(
                  new Filter<LdapPredloga>().Where(o => o.OrgarnizacijaID == OrgID).OrderBy(o => o.Ime));
            StorePredloge.DataSource = predloge;
            StorePredloge.DataBind();

            if (strezniki.Count == 0) warning += " Na organizaciji še ni definiranih strežnikov!";
            if (predloge.Count == 0) warning += " Na organizaciji še ni definiranih predlog!";
            
            lblWarning.Text = warning;
            if (!String.IsNullOrEmpty(warning))                 
                lblWarning.Show();
             else
                lblWarning.Hide();
        }        

        private void SaveOrUpdate()
        {
            LdapPravilo pravilo;
            LdapSinObjekt sinObjekt;

            // (1) SAVE PRAVILO
            if (PraviloID == 0)
                pravilo = EntityFactory.CreateInstance<LdapPravilo>();
            else
                pravilo = EntityFactory.LoadEntity<LdapPravilo>(
                new Filter<LdapPravilo>().Where(r => r.LdapPraviloID == PraviloID));

                pravilo.OrgarnizacijaID = Convert.ToInt32(cmbOrgarnizacije.SelectedItem.Value); 
                pravilo.Ime = txtIme.Text;
                pravilo.Opis = txtOpis.Text;
                pravilo.BaseDN = txtBaseDN.Text;
                pravilo.LdapStreznikID = Convert.ToInt32(cmbStreznik.SelectedItem.Value);
                pravilo.LdapPredlogaID = Convert.ToInt32(cmbPredloga.SelectedItem.Value);
                pravilo.TipSinhronizacije = 0;
                pravilo.Aktivno = chkAktivno.Checked;
                pravilo.Update();

            // (1) SAVE SIN_OBJEKT
            if (PraviloID == 0)
                sinObjekt = EntityFactory.CreateInstance<LdapSinObjekt>();
            else
                sinObjekt = EntityFactory.LoadEntity<LdapSinObjekt>(
                new Filter<LdapSinObjekt>().Where(r => r.LdapPraviloID == PraviloID));

                if (PraviloID==0) {
                    sinObjekt.LdapPraviloID = pravilo.LdapPraviloID;
                }

                sinObjekt.ObjektTipID = Convert.ToInt32(cmbTipEntitete.SelectedItem.Value);
                sinObjekt.ObjektID = Convert.ToInt32(cmbOrgarnizacije.SelectedItem.Value);   // Za tipe 2,3,4 je izhodišče vedno orgarnizacija
                sinObjekt.Update();
        }

        #region Protected
        protected void ButtonClicked(object sender, DirectEventArgs e)
        {
            DialogButtons button = e.DeserializeParameter<DialogButtons>("buttonType");

            if (button == DialogButtons.Save)
            {
                SaveOrUpdate();
            }

            LdapPravilaPodrobnoProxy.Close();
        }

        protected void OnOrgarnizacijaChanged(object sender, DirectEventArgs e)
        {
            LoadStreznikiPredloge();
        }
        #endregion
    }
}
